from datetime import datetime
from typing import Callable, Any

class Runnable:
    def __init__(self, func: Callable):
        """初始化可运行对象，接收一个可调用函数"""
        self.func = func
    
    def __or__(self, other: "Runnable") -> "Runnable":
        """重载 | 运算符，实现链式组合"""
        def chained_func(*args, **kwargs) -> Any:
            # 先执行当前函数，将其结果作为下一个函数的输入
            intermediate = self.func(*args, **kwargs)
            return other.func(intermediate)
        return Runnable(chained_func)
    
    def invoke(self, *args, **kwargs) -> Any:
        """执行管道链"""
        return self.func(*args, **kwargs)

# 定义三个可链式调用的函数
def generate_greeting(name: str) -> str:
    print("----------generate_greeting-----------")
    return f"你好，{name}！"

def append_question(greeting: str) -> str:
    print("----------append_question-----------")
    return f"{greeting} 今天过得怎么样？"

def add_timestamp(message: str) -> str:
    print("----------add_timestamp-----------")
    return f"{message} [当前时间：{datetime.now().strftime('%H:%M:%S')}]"

# 创建可链式组合的Runnable对象
greeting_runnable = Runnable(generate_greeting)
question_runnable = Runnable(append_question)
timestamp_runnable = Runnable(add_timestamp)

# 使用管道符组合成链式调用
chain = greeting_runnable | question_runnable | timestamp_runnable

# 执行链式调用
result = chain.invoke("开发者")
print(result)
# 输出示例：你好，开发者！ 今天过得怎么样？ [当前时间：15:30:45]

# 首次组合（A | B）​​
# A.__or__(B) 被调用，生成一个 ​​闭包函数​​ 封装 A 和 B 的逻辑，并返回新的 RunnableSequence 对象：
# temp_chain = RunnableSequence(
#     func = lambda input: B.run(A.run(input))  # 闭包保存执行顺序
# )